#include "Speed_Ctrol.h"
#include "usart.h"	 

//速度码盘  PA6
//轮子直径66mm，光电码盘齿数为20，轮子周长 207mm = 20.7cm 
//程序采用判断高低电平变化次数计数，也就是说轮子转一周计数次数为40
//一个计数变化表示轮子跑过的距离为 20.7/40 = 0.5175cm

unsigned int motor_speed=0;
unsigned char motor_speed_temp=0;
static unsigned char motor_io=0;
static unsigned int count_10ms=0;

void MeasureInit(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//配置使能GPIO管脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置GPIO模式,输入上拉
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置GPIO端口速度
	GPIO_Init(GPIOA , &GPIO_InitStructure); 
}

/*******************************************************************************
* 函 数 名 ：MeasureSpeed
* 函数功能 ：速度测量，计算IO变化次数，该函数必须每10ms调用一次
* 输    入 ：无
* 输    出 ：无
*******************************************************************************/
void MeasureSpeed(void)
{
	count_10ms++;
	if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) != motor_io)//发生电平变化
	{
		motor_speed_temp++;
		motor_io = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6);
	}
	
	if(count_10ms == 50)//每500ms获取一次速度  
	{
		count_10ms = 0;
//		motor_speed = (motor_speed_temp*2)/40*60 + 0.5; //计算电机速度 RPM 四舍五入
																										//一秒光电门记录的次数 / 40 * 60
		motor_speed = (motor_speed_temp*3) + 0.5;
		motor_speed_temp = 0;
		printf("当前电机转速：%d\r\n",motor_speed);   //测试，整合可删
	}
}

/*******************************************************************************
* 函 数 名 ：ClearMeasure
* 函数功能 ：清除测量，重新开始测量
* 输    入 ：无
* 输    出 ：无
*******************************************************************************/
void ClearMeasure(void)
{
	count_10ms = 0;
	motor_speed_temp = 0;
}


